/**
 * 
 */
package com.pub.db;

import java.io.File;

import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;

/**
 * @author Administrator
 *
 */
public class BerkeleyDB 
{
	private Environment env;
	private Database db;
	
	/**
	 * 
	 */
	public BerkeleyDB() 
	{
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		BerkeleyDB mbdb = new BerkeleyDB();
		mbdb.setUp("D:/workspace/search/bdb", 1000000);
		mbdb.open("test");
		System.out.println("开始向Berkeley DB中存入数据...");
		
		for(int i=0; i<20; i++) {
			try {
				String key = "myKey"+i;
				String value = "myValue"+i;
				System.out.println("[" + key + ":" + value + "]");
				mbdb.put(key , value);
		   	} catch (Exception e) {
		   		e.printStackTrace();
		   	}
		}

		
		mbdb = new BerkeleyDB();
		mbdb.setUp("D:/workspace/search/bdb", 1000000);
		mbdb.open("test");  
		while(true) {
			try {
			    for(int i=0; i<1000; i++) {
			    	System.out.println("从Berkeley DB中取出数据...");
			    	String k = "myKey" + 2*i;
			    	String v = mbdb.get(k);
			    	System.out.println("[" + k + ":" + v +"]");
			     
			    	Thread.sleep(3000);
			     
			    	if(i == 20) {
			    		mbdb.close();
			    		System.exit(0);
			    	}
			    }
		    
			    Thread.sleep(300000);
			} catch (Exception e) {
				e.printStackTrace();
		    }
		}
		
//		mbdb = new BerkeleyDB();
//		mbdb.setUp("D:/workspace/search/bdb", 1000000);
//		mbdb.open("myDB");
//		try {
//			mbdb.delete("myKey0"); // 删除myKey0及其对应的myValue0
//		} catch (Exception e1) {
//			e1.printStackTrace();
//		}
//		  
//		while(true) {
//			try {
//			    for(int i=0; i<20; i++) {
//			    	System.out.println("从Berkeley DB中取出数据...");
//			    	String k = "myKey" + i;
//			    	String v = mbdb.get(k);
//			    	System.out.println("[" + k + ":" + v +"]");
//			     
//			    	Thread.sleep(3000);
//			     }
//			     mbdb.close();
//			     System.exit(0);
//			     Thread.sleep(300000);
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//		}
		
		
//		mbdb = new BerkeleyDB();
//		mbdb.setUp("D:/workspace/search/bdb", 1000000);
//		mbdb.open("myDB");
//		  
//		try {
//			mbdb.update("myKey0", "yourValue"); // 修改数据
//		} catch (Exception e1) {
//			e1.printStackTrace();
//		}
//		  
//		while(true) {
//			try {
//				for(int i=0; i<20; i++) {
//					System.out.println("从Berkeley DB中取出数据...");
//					String k = "myKey" + i;
//					String v = mbdb.get(k);
//					System.out.println("[" + k + ":" + v +"]");
//		     
//					Thread.sleep(3000);
//				}
//				mbdb.close();
//				System.exit(0);
//				Thread.sleep(300000);
//		    } catch (Exception e) {
//		    	e.printStackTrace();
//		    }
//		}
	}
	
	public void setUp(String path, long cacheSize) 
	{
		EnvironmentConfig envConfig = new EnvironmentConfig();
		envConfig.setAllowCreate(true);
		envConfig.setCacheSize(cacheSize);
		try {
			env = new Environment(new File(path),envConfig);
		} catch (DatabaseException e) {
			e.printStackTrace();
		}
	}

	public void open(String dbName) 
	{
		DatabaseConfig dbConfig = new DatabaseConfig();
		dbConfig.setAllowCreate(true);
		try {
			db = env.openDatabase(null, dbName, dbConfig);
		} catch (DatabaseException e) {
			e.printStackTrace();
		}
	}

	public void close() 
	{
		try {
			if(db != null) {
				db.close();
		    }
			
		    if(env != null) {
		     env.close();
		    }
		} catch (DatabaseException e) {
			e.printStackTrace();
		}
	}

	public boolean delete(String key) throws Exception 
	{
		byte[] theKey = key.getBytes("UTF-8");
		OperationStatus status = db.delete(null, new DatabaseEntry(theKey));
		if(status == OperationStatus.SUCCESS) {
			return true;
		}
			return false;
	}
	
	public boolean update(String key, String value) throws Exception 
	{
		byte[] updateKey = key.getBytes("UTF-8");
		byte[] updateValue = value.getBytes("UTF-8");

		OperationStatus status = db.put(null, new DatabaseEntry(updateKey), new DatabaseEntry(updateValue));
		if (status == OperationStatus.SUCCESS) {
			return true;
		}
		
		return false;
	}
	
	public String get(String key) throws Exception 
	{
		DatabaseEntry queryKey = new DatabaseEntry();
		DatabaseEntry value = new DatabaseEntry();
		queryKey.setData(key.getBytes("UTF-8"));

		OperationStatus status = db.get(null, queryKey, value, LockMode.DEFAULT);
		if (status == OperationStatus.SUCCESS) {
			return new String(value.getData());
		}
		
		return null;
	}

	public boolean put(String key, String value) throws Exception 
	{
		byte[] theKey = key.getBytes("UTF-8");
		byte[] theValue = value.getBytes("UTF-8");
		OperationStatus status = db.put(null, new DatabaseEntry(theKey), new DatabaseEntry(theValue));
		
		if(status == OperationStatus.SUCCESS) {
			return true;
		}
		
		return false;
	}

}
